package com.kevin.sql;

import java.sql.Types;
import java.util.Date;

import com.kevin.enums.DBType;

import java.math.BigDecimal;

public class DataType {
	/**
	 * 获得数据类型对应的Type
	 * @param sqlType
	 * @param dbType
	 * @return
	 */
	public static Class<?> getType(int sqlType, DBType dbType)
    {
        switch (sqlType)
        {
            case Types.BIGINT:
            	return long.class;
            case Types.BINARY:
            case Types.LONGVARBINARY:
            case Types.VARBINARY:
            case Types.BLOB:
                return byte[].class;
            case Types.BIT:
                return boolean.class;
            case Types.LONGVARCHAR:
            case Types.CHAR:
            case Types.NCHAR:
            case Types.CLOB:
            case Types.VARCHAR:
                return String.class;
            case Types.DATE:
            case Types.TIME:
            	return Date.class;      
            case Types.TIMESTAMP: //微软的这个不代表时间，而是修改记录
                switch (dbType)
                {
                    case MSSQL:
                    case SYBASE:
                        return byte[].class;
                    default:
                        return Date.class;
                }
            case Types.DECIMAL:
                return BigDecimal.class;
            case Types.DOUBLE:
            case Types.FLOAT:
                return Double.class;
            case Types.SMALLINT:
            case Types.INTEGER:
                return int.class;
            //case Types.TINYINT:
                //return Bute.class;
            default:
                return Object.class;
        }
    }

	
//    public static int getSqlType(Class<?> clazz)
//    {
//        return getSqlType(clazz, DBType.NONE);
//    }
//	
//	/**
//	 * 将DbType类型对应映射到SqlDbType类型
//	 * @param typeInfo
//	 * @return
//	 */
//	public static int getSqlType(Class<?> clazz,DBType dbType){
//		if(clazz == Enum.class){
//			clazz = String.class;
//		}
//		
//		String typeName = clazz.getName();
//		switch (typeName) {
//		case "java.math.BigDecimal":
//			return Types.DECIMAL;
//		case "char":
//			return Types.CHAR;
//		case "byte":
//		case "byte[]":
//			return Types.BINARY;
//		case "java.lang.Enum":
//			return Types.VARCHAR;
//		case "java.lang.Boolean":
//		case "boolean":
//			return Types.BOOLEAN;
//		case "java.lang.Double":
//		case "double":
//			return Types.DOUBLE;
//		case "java.lang.Float":
//		case "float":
//			return Types.FLOAT;
//		case "java.lang.Integer":
//		case "int":
//			return Types.INTEGER;
//		case "java.lang.Long":
//		case "long":
//			return Types.BIGINT;	
//		case "java.lang.String":
//			return Types.NVARCHAR;
//		case "java.lang.Short":
//		case "short":
//			return Types.SMALLINT;
//		case "java.util.Date":
//		case "java.sql.Date":
//            switch (dbType)
//            {
//                case MSSQL:
//                case SYBASE:
//                    return Types.BINARY;
//                default:
//                    return Types.DATE;
//            }
//		default:
//			break;
//		}
//		return Types.VARCHAR;
//		
//	}

	
	/**
	 * 字母型返回0；数字型返回1；日期型返回2；bool返回3；guid返回4；其它返回999
	 * @param sqlType 数据库字段类型
	 * @return
	 */
	public static int getGroup(int sqlType){
		return getGroup(sqlType,DBType.NONE);
	}
	
	/**
	 * 字母型返回0；数字型返回1；日期型返回2；bool返回3；guid返回4；其它返回999
	 * @param sqlType 数据库字段类型
	 * @param dbType
	 * @return
	 */
	public static int getGroup(int sqlType,DBType dbType){
		switch (sqlType) {
		case Types.INTEGER:
		case Types.BIGINT:
		case Types.SMALLINT:
		case Types.TINYINT:
		case Types.FLOAT:
		case Types.REAL:
		case Types.DECIMAL:
		case Types.DOUBLE:
			return 1;
		case Types.NVARCHAR:
		case Types.VARCHAR:
		case Types.SQLXML:
		case Types.CHAR:
		return 0;
		case Types.DATE:
		case Types.TIME:
			return 2;
		case Types.BIT:
			return 3;
		default:
			if(sqlType == Types.TIMESTAMP){
                if (dbType != DBType.MSSQL && dbType != DBType.SYBASE)
                {
                    return 2;
                }
			}
			return 999;
		}
	}
}
